package com.felix.algorithms.tree;

/**
 * BinaryNodeInterface
 *
 * @author xuejinhua
 * @date 2018/9/10 11:23
 */
public interface BinaryNodeInterface<T> {
    /**
     * 返回结点的数据部分
     *
     * @return
     */
    T getData();

    /**
     * 设置结点的数据域的值
     *
     * @param newData
     */
    void setData(T newData);


    /**
     * 获取结点的左孩子
     *
     * @return
     */
    BinaryNodeInterface<T> getLeftChild();

    /**
     * 获取结点的右孩子
     *
     * @return
     */
    BinaryNodeInterface<T> getRightChild();

    /**
     * 设置结点的左孩子为指定结点
     *
     * @param leftChild
     */
    void setLeftChild(BinaryNodeInterface<T> leftChild);

    /**
     * 设置结点的右孩子为指定结点
     *
     * @param rightChild
     */
    void setRightChild(BinaryNodeInterface<T> rightChild);

    /**
     * 判断结点是否有左孩子
     *
     * @return
     */
    boolean hasLeftChild();

    /**
     * 判断结点是否有右孩子
     *
     * @return
     */
    boolean hasRightChild();

    /**
     * 检查结点是否是叶子结点
     *
     * @return
     */
    boolean isLeaf();

    /**
     * 计算以该结点为根的子树的结点数目
     *
     * @return
     */
    int getNumberOfNodes();

    /**
     * 计算以该结点为根的子树的高度
     *
     * @return
     */
    int getHeight();

    /**
     * 复制以该结点为根的子树
     *
     * @return
     */
    BinaryNodeInterface<T> copy();
}
